package com.jml;


 /**
 * @author:jml
 * @date: 2020/4/15 0015 21:16
 * @description：
 */
public class 循环依赖 {
	 /**
	  * 1.表示通过构造器注入构成的循环依赖， 此依赖是无法解决的 ，只能抛出 BeanCurrentlylnCreationException异常表示循环依赖
	  * 如在创 TestA 类时， 构造器需要 TestB 类，那将去创建 TestB 类时又发现需要 TestC 类， 又去创建 TestC 终在创建 TestC 时发现又需要 TestA ，从而形成个环没办法创建，
	  * 在创建TestC中的TestA的时候发现A已经在池子中了。
	  *
	  * 2.Spring容器将每个正在创建的bean标识符放在一个“当前 bean 池”中,bean标识符在创建过程中将一直保持在这个池中，因此如果在创建 bean 过程中发现自己已经在“当前
	  * bean池”里时，将抛出 BeanCurrentlylnCreationException异常表示循环依赖；而对于创建完毕的 bean 将从“当前 bean 池”中清除掉
	  *
	  *
	  *3.setter单例循环依赖：
	  * 	Spring容器在创建单例A，根据无参构造器创建了bean，并暴露了一个ObjectFactory，用于返回一个提前暴露一个创建中的bean，并将A标识符放入当前创建bean池中，然后setter注入B
	  * 	Spring容器在创建单例B，根据无参构造器创建了bean，并暴露了一个ObjectFactory，用于返回一个提前暴露一个创建中的bean，并将B标识符放入当前创建bean池中，然后setter注入'circle'
	  * 	Spring容器在创建单例C，根据无参构造器创建了bean，并暴露了一个ObjectFactory，用于返回一个提前暴露一个创建中的bean，并将C标识符放入当前创建bean池中，然后setter注入A,注入A的时候由于提前暴露了ObjectFactory工厂。从而使他返回提前暴露一个创建中的bean
	  * 	最后再依赖注入AB，完成setter
	  * 对于多例的循环注入，spring是不支持的，因为spring容器不进行缓存多例的作用域bean，无法提前暴露一个创建中的bean
	  *
	  */
 }
